#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据库初始化配置
配置SQLAlchemy数据库连接和初始化表结构
"""

import os
import logging
from flask import Flask
from models.base import db
from models import User, Message, Group, Config, WelcomeRecord
from .config import DatabaseConfig

logger = logging.getLogger(__name__)

def init_database(app: Flask, database_url: str = None, config_dict: dict = None):
    """
    初始化数据库配置
    
    Args:
        app (Flask): Flask应用实例
        database_url (str): 数据库连接URL，优先级最高
        config_dict (dict): 数据库配置字典，如果database_url为None则使用此配置
    """
    # 设置数据库配置
    if database_url is None:
        if config_dict is None:
            # 尝试从环境变量加载配置
            try:
                config_dict = DatabaseConfig.load_config_from_env()
                logger.info(f"从环境变量加载数据库配置: {config_dict.get('type', 'unknown')}")
            except Exception as e:
                logger.warning(f"从环境变量加载配置失败，使用默认SQLite配置: {e}")
                config_dict = DatabaseConfig.SQLITE_CONFIG
        
        # 生成数据库连接URL
        database_url = DatabaseConfig.get_database_url(config_dict)
        
        # 获取引擎选项
        engine_options = DatabaseConfig.get_engine_options(config_dict.get('type', 'sqlite'))
    else:
        # 使用默认引擎选项
        engine_options = {
            'pool_pre_ping': True,
            'pool_recycle': 300,
        }
    
    app.config['SQLALCHEMY_DATABASE_URI'] = database_url
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['SQLALCHEMY_ENGINE_OPTIONS'] = engine_options
    
    # 初始化数据库
    db.init_app(app)
    
    logger.info(f"数据库配置完成: {database_url}")

def create_tables(app: Flask):
    """
    创建数据库表
    
    Args:
        app (Flask): Flask应用实例
    """
    with app.app_context():
        try:
            # 创建所有表
            db.create_all()
            logger.info("数据库表创建成功")
            
            # 初始化默认配置
            init_default_configs()
            
        except Exception as e:
            logger.error(f"创建数据库表失败: {e}")
            raise

def init_default_configs():
    """
    初始化默认系统配置
    """
    try:
        default_configs = [
            {
                'config_key': 'wechat.auto_reply.enabled',
                'config_value': 'true',
                'config_type': 'boolean',
                'category': 'wechat',
                'description': '是否启用自动回复功能',
                'is_system': True,
                'default_value': 'true'
            },
            {
                'config_key': 'wechat.auto_reply.default_message',
                'config_value': '收到！',
                'config_type': 'string',
                'category': 'wechat',
                'description': '默认自动回复消息',
                'is_system': True,
                'default_value': '收到！'
            },
            {
                'config_key': 'wechat.welcome.enabled',
                'config_value': 'false',
                'config_type': 'boolean',
                'category': 'wechat',
                'description': '是否启用新成员欢迎功能',
                'is_system': True,
                'default_value': 'false'
            },
            {
                'config_key': 'wechat.welcome.default_template',
                'config_value': '欢迎 @{member_name} 加入群聊！🎉',
                'config_type': 'string',
                'category': 'wechat',
                'description': '默认欢迎消息模板',
                'is_system': True,
                'default_value': '欢迎 @{member_name} 加入群聊！🎉'
            },
            {
                'config_key': 'news.push.enabled',
                'config_value': 'false',
                'config_type': 'boolean',
                'category': 'news',
                'description': '是否启用新闻推送功能',
                'is_system': True,
                'default_value': 'false'
            },
            {
                'config_key': 'news.push.time',
                'config_value': '09:00',
                'config_type': 'string',
                'category': 'news',
                'description': '新闻推送时间',
                'is_system': True,
                'default_value': '09:00'
            },
            {
                'config_key': 'system.log.level',
                'config_value': 'INFO',
                'config_type': 'string',
                'category': 'system',
                'description': '系统日志级别',
                'is_system': True,
                'default_value': 'INFO'
            }
        ]
        
        for config_data in default_configs:
            # 检查配置是否已存在
            existing_config = Config.query.filter_by(config_key=config_data['config_key']).first()
            if not existing_config:
                config = Config(**config_data)
                db.session.add(config)
        
        db.session.commit()
        logger.info("默认配置初始化完成")
        
    except Exception as e:
        logger.error(f"初始化默认配置失败: {e}")
        db.session.rollback()
        raise

def drop_tables(app: Flask):
    """
    删除所有数据库表（谨慎使用）
    
    Args:
        app (Flask): Flask应用实例
    """
    with app.app_context():
        try:
            db.drop_all()
            logger.warning("所有数据库表已删除")
        except Exception as e:
            logger.error(f"删除数据库表失败: {e}")
            raise

def reset_database(app: Flask):
    """
    重置数据库（删除所有表后重新创建）
    
    Args:
        app (Flask): Flask应用实例
    """
    with app.app_context():
        try:
            # 删除所有表
            db.drop_all()
            logger.warning("已删除所有数据库表")
            
            # 重新创建表
            db.create_all()
            logger.info("已重新创建所有数据库表")
            
            # 初始化默认配置
            init_default_configs()
            logger.info("数据库重置完成")
            
        except Exception as e:
            logger.error(f"重置数据库失败: {e}")
            raise